#include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <complex> #include <cstdio> using namespace std; #define ll long long #define N 100010 ll a[N],n,m,k,num[1<<20],cnt[N]; ll len,ans; struct modui { ll l,r,id; bool operator < (const modui & b)const{ return (l/len==b.l/len)? r<b.r : l<b.l ; } }pr[N]; void add(ll x){ ans += num[x^k]; num[x]++; } void del(ll x){ num[x]--; ans -= num[x^k]; } void work(){ ll l=2,r=1;ans=0; for(int i = 1 ; i <= m ;i++ ){ while(pr[i].r>r)add(a[++r]); while(pr[i].r<r)del(a[r--]); while(pr[i].l>l)del(a[l++]); while(pr[i].l<l)add(a[--l]); cnt[pr[i].id]=ans; } for(int i=1; i<=m ;i++) printf("%I64d\n",cnt[i]); } int main(){ ll tmpa,tmpb; while(~scanf("%I64d%I64d%I64d",&n,&m,&k)){ memset(num,0,sizeof(num)); a[0]=0;len=ceil(sqrt(n*1.0)); for(int i=1 ; i<=n ;i++){ scanf("%I64d",&a[i]); a[i] = a[i]^a[i-1]; } for(int i=1 ; i<=m ;i++){ scanf("%I64d%I64d",&tmpa,&tmpb); tmpa--; pr[i].l=tmpa,pr[i].r=tmpb,pr[i].id=i; } sort(pr+1,pr+m+1); work(); } return 0; }
|